1) Análise da concentração de partículas inaláveis finas (MP\(_{2.5}\)) da cidade de London, província de Ontário, Canadá, no ano de 2013


Contextualização do problema:

O arquivo Matter2013-London.csv, obtido em www.airqualityontario.com, contém informações sobre as concentrações de partículas inaláveis finas (MP\(_{2,5}\), em \(\mu g/m^{3}\) ), registradas no ano de 2013 em London, cidade situada na província canadense de Ontário. Os valores são registrados a cada hora. Para determinado dia D, as variáveis \(\textit{H}_{1}\) a \(\textit{H}_{24}\) representam as medições feitas na primeira até a \(24^{ª}\) hora do dia, respectivamente.

O objetivo desta análise é fazer uma análise exploratória desta série temporal dada por:

\[Y_{t} = min\{H_{j,t}\}\]


item i)

Dados brutos antes do tratamento:

# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)

matter.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/Matter2013-London.csv"

matter <- read_csv(matter.loc)
head(matter)

Dados após preparação:

# ----- data preparation

# passando para formato long;
# eliminando as duas primeiras colunas;
# eliminando os NA's e as entradas com 9999 e -999;
# agrupando por dia e calculando o minimo
matter2 <- matter %>%
  dplyr::select(-(1:2)) %>% # eliminando duas primeiras colunas
  melt(id.vars = "Date") %>% # to long
  magrittr::set_colnames(c("Date", "hora", "MP")) %>%
  dplyr::arrange(Date, hora) %>% # ordenar por dia/hora 
  mutate(MP = replace(MP, MP == 9999 | MP == -999, NA)) %>% # sol: https://stackoverflow.com/questions/35610437/using-dplyr-to-conditionally-replace-values-in-a-column
  na.omit() %>%
  group_by(Date) %>%
  summarise(MP = as.numeric(min(MP, na.rm=TRUE))) # a serie eh baseada no minimo do dia
  # nao precisamos das horas


# passando para tibble e tibbletime:
matter3 <- matter2 %>%
  #tibble::as_tibble() %>%
  #na.omit() %>% # eliminando os NA's
  mutate(Date = lubridate::ymd(Date)) %>% # usando ymd do lubridate
  as_tbl_time(index = Date)



head(matter3)

Gráficos da série temporal \(Y_{t}\):

# ----- plots serie:

# --- serie:
# ggplot:
# matter3 %>%
# ggplot() +
#   geom_line(aes(x = Date, y = MP), colour="orange") +
#   theme_minimal()+
#   labs(title="Série diária de MP")

# dygraphs
library(dygraphs)
library(xts)
matter3_ts <- xts(matter3 %>% dplyr::select(MP), order.by=matter3$Date)
# dygraph(matter3_ts, elementId='matter3') %>% dyRangeSelector()# %>% dyUnzoom()
dygraph(matter3_ts, elementId='matter3', main="Série diária da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("MP", color = "orange")
# rCharts:
# library(rCharts)
# library(rjson)
# dPlot(MP ~ Date, data = matter3, type="line")

Plots da ACF e PACF para analisar estacionariedade:

# ----- plots:
par(mfrow=c(1,2))
acf(matter3_ts)
pacf(matter3_ts)


item ii)

Com base no gráfico da Função de Autocorrelação (FAC ou ACF em inglês), é possível inferir que a série é estacionária. Há um decaimento rápido da autocorrelação nos primeiros lags e, mesmo com uma certa variabilidade neste padrão, a correlação parece tender rapidamente a zero conforme \(h\) aumenta. Este comportamento indica a presença de estacionariedade na série. Se houvesse um decaimento lento da FAC, isto poderia indicar o efeito de uma memória de mais longo prazo nos dados. Consequentemente, teríamos a dependência persistente (entre os valores de \(Y_{t}\)) ao longo do tempo e a não-estacionariedade da série, o que não é o caso.

Haveria, ainda, a possibilidade de empregarmos testes estatísticos para a existência de estacionariedade na série. Uma das possibilidades seria o teste de Dick-Fuller (mais especificamente Augmented Dick-Fuller Test (ADF)), o qual realizamos abaixo:

# Augmented Dick-Fuller Test for Stationarity
tseries::adf.test(matter3_ts, alternative="stationary")
## 
##  Augmented Dickey-Fuller Test
## 
## data:  matter3_ts
## Dickey-Fuller = -6.3473, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary

Portanto, com um p-valor abaixo de \(1\%\), o resultado nos permite afirmar que há evidências para se aceitar a hipótese de que a série é estacionária, considerando um nivel \(\alpha\) de \(5\%\) para o teste.


item iii)

Com base na análise descritiva apresentada no item i), o decaimento geométrico nos primeiros lags da FAC, associado ao decaimento abrupto da FACP sugere a assinatura de um modelo Autoregressivo \(A.R.(p)\). Neste caso, para identificar a ordem deste modelo, podemos olhar para o gráfico da Função de Autocorrelação Parcial (FACP ou PACF em inglês). Este gráfico apresenta spike significante (ordenado) apenas para \(h = 1\). Por isso, o modelo de filtro linear adequado para o processo em questão seria um Modelo Autoregressivo de Ordem Um (\(A.R.(1)\)):

\[ Y_{t} = \mu_{0} + \rho Y_{t-1} + \epsilon_{t}\]



2) Análise de dados de Potencial Hidrogeniônico (pH) coletados pelo Departamento de Recursos Hídricos do estado da Califórnia - EUA


Contextualização do problema:

O potencial Hidrogeniônico (pH) é uma variável importante no monitoramento da qualidade da água, uma vez que ele afeta o metabolismo de várias espécies aquáticas. De um modo geral, para a proteção da vida aquática, o pH deve estar entre 6 e 9. Tomou-se o conjunto de dados Potencial Hidrogeniônico (pH), obtido junto ao Departamento de Recursos Hídricos do Estado da California, EUA. A série histórica é constituída por 72.570 observações registradas a cada 15 minutos, de 9/mar/2012 a 9/jun/2014.

O objetivo desta análise é fazer uma análise exploratória desta série temporal dada por \(X_{t}\) no intraday.


item i)

Dados brutos antes do tratamento:

# ----- leitura e carregamento
library(tibbletime)
library(dplyr)
library(ggplot2)
library(readr)
library(lubridate)
library(reshape2)

ph2012.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2012.CSV"
ph2013.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2013.CSV"
ph2014.loc <- "/home/allan/Documents/1S2018/A_SERIES_TEMPORAIS/aulas/dados/pH2014.CSV"

ph2012 <- read_csv(ph2012.loc)
ph2013 <- read_csv(ph2013.loc)
ph2014 <- read_csv(ph2014.loc)

# juntando
ph <- bind_rows(ph2012, ph2013, ph2014)

head(ph)

Dados após tratamento:

# data preparation
# convertendo para tibble time (serie temporal)
# library(lubridate)
ph2 <- ph %>%
  mutate(Date = lubridate::mdy_hm(Date)) %>% # usando mdy_hm do lubridate
  as_tbl_time(index = Date)

# filtrando
# # nao precisa - vamos usar toda a serie
# ph2 <- ph %>%
#   filter_time('start' ~ 'end')

head(ph2)

Plots da série temporal \(X_{t}\):

# ----- plots serie:

# --- serie:
ph2 %>%
ggplot(aes(x = Date, y = Point, colour="coral2")) +
  geom_line() +
  theme_minimal()+
  labs(title="Série intraday (15 minutos) da variável Point")

# dygraphs
library(dygraphs)
library(xts)
ph2_ts <- xts(ph2 %>% dplyr::select(Point), order.by=ph2$Date)
# dygraph(matter3_ts, elementId='matter3') %>% dyRangeSelector()# %>% dyUnzoom()
dygraph(ph2_ts, elementId='ph2', main="Série diária da variável MP" ) %>% dyRangeSelector() %>% dyUnzoom() %>%
  dySeries("Point", color = "orange")
# rCharts:
# library(rCharts)
# library(rjson)
# dPlot(MP ~ Date, data = matter3, type="line")

Não parece haver comportamento cíclico, mas utilizar um período de minutos para a série, parece tornar o gráfico muito denso, dificultando a “leitura” do gráfico. Então, vamos transformar para uma periodicidade horária:

# ----- plots serie:

# --- serie:
ph2 %>%
  as_period("1 h") %>% # haverah uma linha para cada hora
  ggplot(aes(x = Date, y = Point)) +
  geom_line(colour="coral2") +
  theme_minimal()+
  labs(title="Série intraday da variável Point")

Periodicidade diária:

ph2 %>%
  as_period("1 day") %>%
  ggplot(aes(x = Date, y = Point)) +
  geom_line(colour="red") + 
  labs(title="Série diária")

Periodicidade semanal:

ph2 %>%
  as_period("1 week") %>%
  ggplot(aes(x = Date, y = Point)) +
  geom_line(colour="green") + 
  labs(title="Série semanal")

Periodicidade mensal:

ph2 %>%
  as_period("1 m") %>%
  ggplot(aes(x = Date, y = Point)) +
  geom_line(colour="purple") + 
  labs(title="Série mensal")